package com.xiaoyu.string;

import java.util.HashMap;

/**
 * @program: DS_and_A
 * @description:
 * 给定一个正整数 n ，输出外观数列的第 n 项。
 * 「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。
 *
 * 输入：n = 4
 * 输出："1211"
 *
 * 要 描述 一个数字字符串，首先要将字符串分割为 最小 数量的组，每个组都由连续的最多 相同字符 组成。
 * 然后对于每个组，先描述字符的数量，然后描述字符，形成一个描述组。
 * 要将描述转换为数字字符串，先将每组中的字符数量用数字替换，再将所有描述组连接起来。
 *
 * @author: YuWenYi
 * @create: 2021-04-25 17:20
 **/

/*
  失败案例,死在分组上!!!
  HashMap<Character, Integer> group = new HashMap<>();
        for (int i = 0; i < res.length()-1; i++) {
            if (res.charAt(i) != res.charAt(i+1)){
                group.put(res.charAt(i),1);
                if (i == res.length()-2){
                    group.put(res.charAt(res.length()-1),1);
                }
            }else {

            }
       }
* */
public class CountAndSay {
    public String countAndSay(int n) {
        if (n == 1)
            return "1";
        String s = countAndSay(n - 1); //进来后直接进入递归最底层触底
        StringBuilder res = new StringBuilder(); //使用StringBuilder效率更高
        for (int i = 0; i < s.length(); i++) {  //从一开始的"1"开始,开始回弹
            int count = 1;  //用来计算重复数的个数
            while (i<s.length()-1 && s.charAt(i) == s.charAt(i+1)){ //这个是个防止数组越界的好办法!!
                count++;
                i++;    //如果加到了s.length()-1,即i等于s的最后一个字符了,那么就不需要比了,倒数的那2个或者多个字符肯定是相同的
            }
            res.append(count).append(s.charAt(i)); //以先count,再字符的顺序,进行拼串
        }
        return res.toString();  //每一级都是这样,返回res.toString()
    }

  /*  public void helper(int n,String s){
        //递归
    }*/

    public static void main(String[] args) {
        CountAndSay cas = new CountAndSay();

        int n = 4;
        String s = cas.countAndSay(n);
        System.out.println(s);
    }
}
